program ProjLPP;

uses crt,tipos,unipro,uvenda,uextra,mvenda;

var
   Op         : Integer;

   LClientes  : TListaCli;
   LProdutos  : TListaPro;
   LVendedores: TListaVend;
   LVendas    : TListaVenda;

   ICliente   : TCliente;
   IProduto   : TProduto;
   IVendedor  : TVendedor;
   IVenda     : TVenda;

procedure MostrarProduto( i: TProduto );
   begin
      TextColor(Green);
      gotoxy(01,12); writeln('Dados cadastrados: ');

      write('Produto   : '); writeln( i.DesPro );
      write('Preco     : '); writeln( i.PrePro:7:2 );
      write('Quantidade: '); writeln( i.QtdEstoquePro );
      TextColor(LightGray);
   end;

procedure MostrarCliente( i: TCliente );
   begin
      TextColor(Green);
      gotoxy(01,12); writeln('Dados cadastrados: ');

      write('Nome      : '); writeln( i.NomeCli );
      TextColor(LightGray);
   end;

procedure MostrarVendedor( i: TVendedor );
   begin
      TextColor(Green);
      gotoxy(01,12); writeln('Dados cadastrados: ');

      write('Nome      : '); writeln( i.NomeVend );
      TextColor(LightGray);
   end;

procedure ReceberProduto( var i: TProduto; str: string );
   begin
      TextColor(Red+Blink);
      gotoxy(30,01); writeln( str );
      TextColor(LightGray);

      write('Produto   : '); readln( i.DesPro );
      write('Preco     : '); readln( i.PrePro );
      write('Quantidade: '); readln( i.QtdEstoquePro );
   end;

procedure ReceberCliente( var i: TCliente; str: string );
   begin
      TextColor(Red+Blink);
      gotoxy(30,01); writeln( str );
      TextColor(LightGray);

      write('Nome      : '); readln( i.NomeCli );
   end;

procedure ReceberVendedor( var i: TVendedor; str: string );
   begin
      TextColor(Red+Blink);
      gotoxy(30,01); writeln( str );
      TextColor(LightGray);

      write('Nome      : '); readln( i.NomeVend );
   end;

procedure IncluirProduto( var l: TListaPro; i: TProduto );
   var
      Ret : Integer;
      mRet: Integer;
      Op  : Char;
   begin
      TextColor(LightGray);
      window(32,05,80,20);
      clrscr;

      repeat
         clrscr;
         write('Codigo    : '); readln( i.CodPro );
         Ret:=PesqPro( l, i );

         case Ret of
            1: begin
               MostrarProduto( i );
               Op:=Mensagem('(A)lterar, (E)xcluir, (F)inalizar? ');
               if ( upCase(Op)='A' ) then
                  begin
                  clrscr;
                  MostrarProduto( i );
                  ReceberProduto( i, 'Alteracao' );
                  mRet:=AlteraPro( l, i );

                  Op:=Mensagem('Finalizar (s/n)? ');
                  end
               else if ( upCase(Op) = 'E' ) then
                  begin
                  clrscr;
                  TextColor(Red+Blink);
                  gotoxy(30,01); writeln( 'Exclusao' );
                  TextColor(LightGray);

                  MostrarProduto( i );

                  Op:=Mensagem('Confirma exclusao (s/n)? ');

                  if ( upCase(Op) = 'S' ) then mRet:=ExcluiPro( l, i );

                  Op:=Mensagem('Finalizar (s/n)? ');
                  end;
               end;
          2,3: begin
               ReceberProduto( i, 'Inclusao' );
               mRet:=IncluiPro( l, i );

               Op:=Mensagem('Finalizar (s/n)? ');
               end;
            4: begin
               Mensagem('Codigo invalido!');
               Op:='N';
               end;
         end;
      until (upCase(Op)='F') or (upCase(Op)='S');
   end;

procedure IncluirCliente( var l: TListaCli; i: TCliente );
   var
      Ret: Integer;
      Op : Char;
   begin
      TextColor(LightGray);
      window(32,05,80,20);
      clrscr;

      repeat
         clrscr;
         write('Codigo    : '); readln( i.CodCli );
         Ret:=PesqCli( l, i );

         case Ret of
            1: begin
               MostrarCliente( i );
               Op:=Mensagem('(A)lterar, (E)xcluir, (F)inalizar? ');
               if ( upCase(Op)='A' ) then
                  begin
                  clrscr;
                  MostrarCliente( i );
                  ReceberCliente( i, 'Alteracao' );
                  AlteraCli( l, i );
                  Op:=Mensagem('Finalizar (s/n)? ');
                  end
               else if ( upCase(Op) = 'E' ) then
                  begin
                  clrscr;
                  TextColor(Red+Blink);
                  gotoxy(30,01); writeln( 'Exclusao' );
                  TextColor(LightGray);

                  MostrarCliente( i );

                  Op:=Mensagem('Confirma exclusao (s/n)? ');

                  if ( upCase(Op) = 'S' ) then ExcluiCli( l, i );

                  Op:=Mensagem('Finalizar (s/n)? ');
                  end;
               end;
          2,3: begin
               ReceberCliente( i, 'Inclusao' );
               IncluiCli( l, i );
               Op:=Mensagem('Finalizar (s/n)? ');
               end;
            4: begin
               Mensagem('Codigo invalido!');
               Op:='N';
               end;
         end;
      until (upCase(Op)='F') or (upCase(Op)='S');
   end;

procedure IncluirVendedor( var l: TListaVend; i: TVendedor );
   var
      Ret: Integer;
      Op : Char;
   begin
      TextColor(LightGray);
      window(32,05,80,20);
      clrscr;

      repeat
         clrscr;
         write('Codigo    : '); readln( i.CodVend );
         Ret:=PesqVend( l, i );

         case Ret of
            1: begin
               MostrarVendedor( i );
               Op:=Mensagem('(A)lterar, (E)xcluir, (F)inalizar? ');
               if ( upCase(Op)='A' ) then
                  begin
                  clrscr;
                  MostrarVendedor( i );
                  ReceberVendedor( i, 'Alteracao' );
                  AlteraVend( l, i );
                  Op:=Mensagem('Finalizar (s/n)? ');
                  end
               else if ( upCase(Op) = 'E' ) then
                  begin
                  clrscr;
                  TextColor(Red+Blink);
                  gotoxy(30,01); writeln( 'Exclusao' );
                  TextColor(LightGray);

                  MostrarVendedor( i );

                  Op:=Mensagem('Confirma exclusao (s/n)? ');

                  if ( upCase(Op) = 'S' ) then ExcluiVend( l, i );

                  Op:=Mensagem('Finalizar (s/n)? ');
                  end;
               end;
          2,3: begin
               ReceberVendedor( i, 'Inclusao' );
               IncluiVend( l, i );
               Op:=Mensagem('Finalizar (s/n)? ');
               end;
            4: begin
               Mensagem('Codigo invalido!');
               Op:='N';
               end;
         end;
      until (upCase(Op)='F') or (upCase(Op)='S');
   end;

procedure IncluirVendas( var l: TListaVenda; var i: TVenda );
   Var
      Item: TItem;
   begin
      Titulo ( 'M O D U L O   D E  V E N D A S' );

      TextColor(LightGray);
      window(01,05,80,24);
      clrscr;

      readkey;

   end;

procedure Relatorios( lCli: TListaCli; lPro: TListaPro; lVen: TListaVend; lVda: TListaVenda; Tipo: char );
   var
      F        : Text;
      Cnt, Cnt1: Byte;
      iPro     : TProduto;

   begin
      Assign( F, 'RPT'+Tipo+'.TXT' );
      Rewrite( F );

      Case Tipo of
         'P': begin
              Writeln( F, '================================================================================');
              Writeln( F, 'ESTOQUE DE PRODUTOS' );
              Writeln( F, '================================================================================');
              for Cnt:=Low(lPro.C) to lPro.Qtd do
                 begin
                 Writeln( F, lPro.C[Cnt].CodPro,'-',lPro.C[Cnt].DesPro,'-',lPro.C[Cnt].QtdEstoquePro );
                 end;
              Writeln( F, '================================================================================');
              Close( F );
              end;
         'C': begin
              Writeln( F, '================================================================================');
              Writeln( F, 'CADASTRO DE CLIENTES' );
              Writeln( F, '================================================================================');
              for Cnt:=Low(lCli.C) to lCli.Qtd do
                 begin
                 Writeln( F, lCli.C[Cnt].CodCli,'-',lCli.C[Cnt].NomeCli );
                 end;
              Writeln( F, '================================================================================');
              Close( F );
              end;
         'V': begin
              Writeln( F, '================================================================================');
              Writeln( F, 'CADASTRO DE VENDEDORES' );
              Writeln( F, '================================================================================');
              for Cnt:=Low(lVen.C) to lVen.Qtd do
                 begin
                 Writeln( F, lVen.C[Cnt].CodVend,'-',lVen.C[Cnt].NomeVend );
                 end;
              Writeln( F, '================================================================================');
              Close( F );
              end;
         'N': begin
              Writeln( F, '================================================================================');
              Writeln( F, 'RELATORIO DE VENDAS' );
              Writeln( F, '================================================================================');
              for Cnt:=Low(lVda.C) to lVda.Qtd do
                 begin
                 Writeln(F,'Vendedor: ',lVda.C[Cnt].Vendedor.NomeVend,' Cliente: ',lVda.C[Cnt].Cliente.NomeCli,
                 ' Data:', lVda.C[Cnt].DataVend );
                 for Cnt1:=Low(LVda.C[Cnt].Itens) to lVda.C[Cnt].Qtd do
                    begin
                       iPro.CodPro := lVda.C[Cnt].Itens[Cnt1].CodPro;
                       PesqPro( lPro, iPro );
                       Writeln(F,'**', iPro.CodPro, '-', iPro.DesPro, '/ Qtd: ', lVda.C[Cnt].Itens[Cnt1].QtdItem,
                       '    // Subtotal: ', (lVda.C[Cnt].Itens[Cnt1].QtdItem * iPro.PrePro):7:2 );
                    end;
                 Writeln( F, '................................................................................');
                 end;

              Writeln( F, '================================================================================');
              Close( F );
              end;
      end;
      writeln('Arquivo de relatorio: ' + 'RPT'+Tipo+'.TXT');
      writeln('Pressione qualquer tecla para continuar...');
      readkey;
   end;
begin
   TextColor(White);
   TextBackGround(Black);
   clrscr;

   Titulo('P R O J E T O  L P P');

   AbreArqs(LClientes, LVendedores, LProdutos);
   AbreArqVenda( LVendas );

   Repeat
      Op:=MenuPrinc;
      Case Op of
         1: IncluirProduto( LProdutos, IProduto );
         2: IncluirCliente( LClientes, ICliente );
         3: IncluirVendedor( LVendedores, IVendedor );
         4: ModuloVendas( LVendas, IVenda, LClientes, LVendedores, LProdutos );
         5: Relatorios( LClientes, LProdutos, LVendedores, LVendas, 'P' );
         6: Relatorios( LClientes, LProdutos, LVendedores, LVendas, 'C' );
         7: Relatorios( LClientes, LProdutos, LVendedores, LVendas, 'V' );
         8: Relatorios( LClientes, LProdutos, LVendedores, LVendas, 'N' );
         9: begin
            AtuArq(LClientes, LVendedores, LProdutos);
            AtuArqVenda( LVendas );
            end;
         0: writeln('Finalizando...');
      end;
   Until ( Op=0 );

   AtuArq(LClientes, LVendedores, LProdutos);
   AtuArqVenda( LVendas );
   clrscr;
end.